/***************************************************************************//**
 * @file mac_timeSync.h
 * @brief for mac time synchronized, 
 * @author ze .
 * @date  2022/7/03.
 * @copyright Copyright 
 ******************************************************************************/

#ifndef _MAC_TIMESYNC_H_
#define _MAC_TIMESYNC_H_

#include"stdint.h"
#include"stdio.h"

#define RF_HFXO_AFC_CTUNE_CALIBRATE_ENABLE //使能通过接收的AFC频偏值来 修正HFXO的负载电容 进而改变频偏；

#define HUB_RF_INTERRUPT_DELAY 8 //HUB内RF中断打时间戳的延时，单位1/32768,待测量，会收到临界保护的影响？,
// HUB_RF_INTERRUPT_DELAY/RFM_RF_INTERRUPT_DELAY  +  RFM_TRANS_TO_HUB_T1/HUB_TRANS_TO_RFM_T1 = 14
#define HUB_TRANS_TO_RFM_T1   14 // HUB至RFM打时间戳至发送的延时，单位1/32768，待测量
//#define HUB_TRANS_TO_RFM_LBT_TX_T1  (HUB_TRANS_TO_RFM_T1 + 10) //HUB至RFM打时间戳写FiFo 开启接收判断信道实时信号强度做LBT后 至发送的延时，单位1/32768，待测量

#define RFM_RF_INTERRUPT_DELAY 8 //RFM内RF中断打时间戳的延时，单位1/32768,待测量，会收到临界保护的影响？
#define RFM_TRANS_TO_HUB_T1   14 // RFM至HUB打时间戳至发送的延时，单位1/32768，
//#define RFM_TRANS_TO_HUB_LBT_TX_T1  (RFM_TRANS_TO_HUB_T1 + 10)//RFM至HUB打时间戳写FiFo 开启接收判断信道实时信号强度做LBT后 至发送的延时，单位1/32768，待测量,初步测量增加10而已？

#define RFM_HUB_SYNC_ERROR_MAX_TOLERANCE  819//时间误差容忍度最大  +-25ms 单位为1/32768s
#define RFM_HUB_SYNC_ERROR_MID_TOLERANCE  327   //时间误差容忍度一般 +-10ms
#define RFM_HUB_SYNC_CAL_TIME_INTERVAL_MIN  0x80000//32768*16
#define RFM_HUB_SYNC_CTUNE_CAL_MAX_ALLOWED_ERROR_RATE_PPM   100//正常情况下晶振频偏误差最大值，PPM 最大允许200

#define RFM_SYNC_DRIFT_HUB           0  //RFM不滞后HUB25ms，意味着若RFM比HUB时间快，将无法正常通信，若RFM比HUB时间慢；需避开400s整数倍时刻+-5ms(164) 

typedef void (*pFuncSyncTimerCallback)(void);//用于给子设备APP提供 协议栈周期唤醒时刻的 回调上层处理函数，方便低功耗的APP执行周期动作，如采集电压、电流、温湿度等信息；ToDo

void setRxTimeStamp(uint32_t rxTime);

/**
 * @brief 时间同步接口，由接收处理侧调用
 * 
 * @param Thub HUB发送时间戳；
 * @param t_packet 报文的持续时间，前导码+同步字+Payload+CRC长 * 8 / bps；
 * @param Trx     RFM接收中断的本地时间戳；
 * @return int 0: 误差值, 可正可负；
 */
int doTimeSyncToHub(uint32_t Thub, uint32_t t_packet);
void timeSyncToHub();
/**
 *
 * @brief 时间同步接口，由接收处理侧调用,评估时间同步误差
 *
 * @param Trfm RFM发送时间戳，24bit 512s周期时间；校准前先disable compare interrupt. 针对BURTC进行
 * @param t_packet 报文的持续时间，前导码+同步字+Payload+CRC长 * 8 / bps * 32768(<<实现)
 * @param Trx     HUB接收中断的本地时间戳；
 * @return int 0: 误差值, 可正可负；
 */
int evaluaTimeSyncError(uint32_t Trfm, uint32_t t_packet);
void calcRfmTimeSyncError();

uint8_t isTimeSynced(void);
void clearTimeSyncedFlag(void);

void startAlwaysRxMainChanUpdateTimer(uint8_t isFirstlyStart);
void stopAlwaysRxMainChanUpdateTimer();
void startSyncBcastTimer(uint8_t isFirstlyStart);
void stopSyncBcastTimer();
void startRxWakeTimer(uint8_t isFirstlyStart);
void stopRxWakeTimer();
void startSpvnTimer(uint8_t isFirstlyStart);
void stopSpvnTimer();
void timeSyncEventCheck();

#endif
